package view.commonview;

import java.awt.Shape;
import java.awt.geom.Point2D;

import view.UtilityLogicDesigns;

import model.LogicType;

/**
 * <b>Funktion:</b> repraesentiert ein Bauteil<br>
 * View-Klasse die ein Bauteil repraesentiert. Hat Informationen ueber sein
 * Aussehen in Form eines Shape.
 * 
 * @author Team Locsi
 * 
 */
public class LogicViewElement {

	private double sourceX;
	private double sourceY;
	private String distinctName;
	private Shape design;
	private boolean isMarked;

	/**
	 * Dieser Konstruktor erzeugt ein neues <code>LogicViewElement</code> -
	 * Objekt.
	 * 
	 * @param source
	 *            <code>Point2D</code> - Koordinaten des
	 *            <code>LogicViewElement</code> in Pixel
	 * @param design
	 *            <code>Shape</code> - Design des <code>LogicViewElement</code>
	 * @param name
	 *            <code>String</code> - Name des <code>LogicViewElement</code>
	 */
	public LogicViewElement(Point2D source, Shape design, String name) {
		this.sourceX = source.getX();
		this.sourceY = source.getY();
		this.design = design;
		this.distinctName = name;
		this.isMarked = false;
	}

	/**
	 * Setzt den Namen des <code>LogicViewElement</code>.
	 * 
	 * @param elementsName
	 *            <code>String<code> - zu setzender Name
	 */
	public void setElementsName(String elementsName) {
		this.distinctName = elementsName;
	}

	/**
	 * Gibt den Namen des <code>LogicViewElement</code> zurueck.
	 * 
	 * @return <code>String</code> - den Namen des <code>LogicViewElement</code>
	 */
	public String getElementsName() {
		return distinctName;
	}

	/**
	 * Setzt den Wert der Markierung des <code>LogicViewElement</code>.
	 * 
	 * @param isMarked
	 *            <code>boolean</code> - <code>true</code>, falls markiert;
	 *            <code>false</code> sonst
	 */
	public void setMarked(boolean isMarked) {
		this.isMarked = isMarked;
	}

	/**
	 * Gibt den Wert der Markierung des <code>LogicViewElement</code> zurueck.
	 * 
	 * @return <code>boolean</code> - <code>true</code>, falls markiert;
	 *         <code>false</code> sonst
	 */
	public boolean isMarked() {
		return isMarked;
	}

	/**
	 * Setzt die y-Koordinate in Pixel des <code>LogicViewElement</code> (links
	 * oben)
	 * 
	 * @param sourceY
	 *            <code>double</code> - die zu setzende y-Koordinate in Pixel
	 */
	public void setSourceY(double sourceY) {
		this.sourceY = sourceY;
	}

	/**
	 * Gibt die y-Koordinate in Pixel des <code>LogicViewElement</code> (links
	 * oben) zurueck.
	 * 
	 * @return <code>double</code> - y-Koordinate von
	 *         <code>LogicViewElement</code> in Pixel
	 */
	public double getSourceY() {
		return sourceY;
	}

	/**
	 * Setzt die x-Koordinate in Pixel des <code>LogicViewElement</code> (links
	 * oben)
	 * 
	 * @param sourceX
	 *            <code>double</code> - die zu setzende x-Koordinate in Pixel
	 */
	public void setSourceX(double sourceX) {
		this.sourceX = sourceX;
	}

	/**
	 * Gibt die x-Koordinate in Pixel des <code>LogicViewElement</code> (links
	 * oben) zurueck.
	 * 
	 * @return <code>double</code> - x-Koordinate von
	 *         <code>LogicViewElement</code> in Pixel
	 */
	public double getSourceX() {
		return sourceX;
	}

	/**
	 * Gibt das Design des <code>LogicViewElement</code> zurueck.
	 * 
	 * @return <code>Shape</code> - Design des <code>LogicViewElement</code>
	 */
	public Shape getDesign() {
		return design;
	}

	/**
	 * Diese Methode setzt das Design eines Bauteils neu, z.B. falls sich die
	 * Koordinaten des Bauteils geaendert haben
	 * 
	 * @param lType
	 *            <code>LogicType</code> des Bauteils
	 * @param xPos
	 *            x-Position des Bauteils
	 * @param yPos
	 *            y-Positoin des Bauteils
	 * @param maxIO
	 *            maximale Anzahl von Inputs oder Outputs
	 */
	public void resetDesign(LogicType lType, double xPos, double yPos, int maxIO) {
		if (lType == LogicType.SELFDEFINED) {
			design = UtilityLogicDesigns.getLogicSelfdefinedDesign(xPos, yPos,
					maxIO);
		} else {
			design = UtilityLogicDesigns.getLogicDesign(lType, xPos, yPos);
		}

	}

	/**
	 * Diese Methode setzt das Design auf
	 * @param newShape neues Design
	 */
	public void setDesign(Shape newShape) {
		this.design = newShape;
	}
}